package cn.cocho.android.mc.file;

import java.io.File;

import android.graphics.Bitmap;
import android.graphics.BitmapFactory;
import android.graphics.drawable.BitmapDrawable;
import android.graphics.drawable.Drawable;
import android.os.AsyncTask;
import android.os.Environment;
import android.view.View;
import android.widget.ImageView;

import cn.cocho.android.mc.character.MD5Encrypt;
import cn.cocho.android.mc.character.StringUtils;
import cn.cocho.android.mc.log.LoggerUtils;

/**
 * 加载图片（如果缓存中有在从缓存中取，如果缓存中没有则从网上下载并保存到缓存中）
 * 
 * @author HAIKANG SONG
 * @time 2013-4-23下午7:11:38
 */
public class ImageStorage extends ImageCache {

	/**
	 * 缓存图片的路径
	 */
	public static String imageStoragePath = Environment.getExternalStorageDirectory() + File.separator + "mc/cache/storage/";

	private static final String imgSuffix = ".imgstorage";// 缓存图片的后缀名

	/**
	 * 根据图片的URL加载图片（如果缓存中有则从缓存中取，否则根据URL下载）
	 * 
	 * @param url
	 *            图片的URL
	 * @return 位图对象/null
	 * @author HAIKANG SONG
	 * @time 2013-4-23下午7:22:40
	 */
	public static Bitmap loadImg(String url) {
		Bitmap bitMap = null;
		if (StringUtils.isNotBlank(url) || StringUtils.isNotBlank(imageCachePath)) {
			String imgPath = imageCachePath + MD5Encrypt.getMD5(url) + imgSuffix;// 通过URL解析出图片对应的本地位置
			if (new File(imgPath).exists()) {
				bitMap = BitmapFactory.decodeFile(imgPath);
			} else {
				boolean result = FileDownload.download(url, imgPath);
				if (result) {
					bitMap = BitmapFactory.decodeFile(imgPath);
				}
			}
		} else {
			LoggerUtils.error(ImageCache.class.getName(), new IllegalArgumentException("图片URL或图片存储路径不能为空"));
		}
		return bitMap;
	}

	/**
	 * 根据图片的URL异步加载图片，并显示在指定的控件里
	 * 
	 * @param url
	 *            图片的URL
	 * @param view
	 *            显示图片的控件
	 * @author HAIKANG SONG
	 * @time 2013-4-24上午11:08:20
	 */
	public static void loadImg(final String url, final ImageView view) {
		if (StringUtils.isBlank(url) || view == null) {
			LoggerUtils.error(ImageCache.class.getName(), new IllegalArgumentException("图片URL或图片控件不能为空"));
			return;
		}

		view.setTag(url);
		new AsyncTask<Object, Object, Bitmap>() {
			@Override
			protected Bitmap doInBackground(Object... arg0) {
				return loadImg(url);
			}

			@Override
			protected void onPostExecute(Bitmap img) {
				if (img != null && url.equals(view.getTag())) {
					view.setImageBitmap(img);
				}
			}
		}.execute();
	}

	/**
	 * 根据图片的URL异步加载图片，并显示在指定的控件里
	 * 
	 * @param url
	 *            图片的URL
	 * @param view
	 *            显示图片的控件
	 * @author HAIKANG SONG
	 * @time 2013-4-24上午11:08:20
	 */
	public static void loadImg(final String url, final ImageView view, final Integer defaultImgId) {
		if (StringUtils.isBlank(url) || view == null) {
			LoggerUtils.error(ImageCache.class.getName(), new IllegalArgumentException("图片URL或图片控件不能为空"));
			return;
		}

		view.setTag(url);
		new AsyncTask<Object, Object, Bitmap>() {
			@Override
			protected Bitmap doInBackground(Object... arg0) {
				return loadImg(url);
			}

			@Override
			protected void onPostExecute(Bitmap img) {
				if (url.equals(view.getTag())) {
					if (img == null) {
						view.setImageResource(defaultImgId);
					} else {
						view.setImageBitmap(img);
					}
				}
			}
		}.execute();
	}

	/**
	 * 根据图片的URL加载接近于指定尺寸的图片（如果缓存中有则从缓存中取，否则根据URL下载）
	 * 
	 * @param url
	 *            图片的URL
	 * @param width
	 *            期望图片的宽度
	 * @param height
	 *            期望图片的高度
	 * @return 位图对象/null
	 * @author HAIKANG SONG
	 * @time 2013-4-23下午7:25:50
	 */
	public static Bitmap loadImg(String url, int width, int height) {
		Bitmap bitmap = loadImg(url);
		if (bitmap != null) {
			String imgPath = imageCachePath + MD5Encrypt.getMD5(url) + imgSuffix;// 通过URL解析出图片对应的本地位置
			bitmap = ImageCompress.compressImage(imgPath, width, height);
		}
		return bitmap;
	}

	/**
	 * 根据图片的URL加载接近于指定尺寸的图片,并显示在指定的控件里
	 * 
	 * @param url
	 *            图片的URL
	 * @param view
	 *            显示图片的控件
	 * @param width
	 *            期望图片的 宽度
	 * @param height
	 *            期望图片的高度
	 * @author HAIKANG SONG
	 * @time 2013-4-24上午11:09:08
	 */
	public static void loadImg(final String url, final ImageView view, final int width, final int height) {
		if (StringUtils.isBlank(url) || view == null) {
			LoggerUtils.error(ImageCache.class.getName(), new IllegalArgumentException("图片URL或图片控件不能为空"));
			return;
		}

		new AsyncTask<Object, Object, Bitmap>() {
			@Override
			protected Bitmap doInBackground(Object... arg0) {
				view.setTag(url);
				return loadImg(url, width, height);
			}

			@Override
			protected void onPostExecute(Bitmap img) {
				if (img != null && url.equals(view.getTag())) {
					view.setImageBitmap(img);
				}
			}
		}.execute();
	}

	/**
	 * 加载图片
	 * 
	 * @param url
	 *            图片的URL
	 * @param view
	 *            显示图片的控件
	 * @param width
	 *            期望图片的宽度
	 * @param height
	 *            期望图片的高度
	 * @param defaultImage
	 *            通过URL未加载到图片时使用默认图片填充
	 * @author HAIKANG SONG
	 * @time 2013-6-25上午11:09:08
	 */
	public static void loadImg(final String url, final ImageView view, final int width, final int height, final Bitmap defaultImage) {
		if (StringUtils.isBlank(url) || view == null) {
			LoggerUtils.error(ImageCache.class.getName(), new IllegalArgumentException("图片URL或图片控件不能为空"));
			return;
		}

		view.setTag(url);
		new AsyncTask<Object, Object, Bitmap>() {
			@Override
			protected Bitmap doInBackground(Object... arg0) {
				return loadImg(url, width, height);
			}

			@Override
			protected void onPostExecute(Bitmap img) {
				if (url.equals(view.getTag())) {
					if (img == null) {
						view.setImageBitmap(defaultImage);
					} else {
						view.setImageBitmap(img);
					}
				}
			}
		}.execute();
	}

	/**
	 * 返回默认大小url指定的图片。
	 * 
	 * @param url
	 *            图片对应的url
	 * @param callback
	 *            获取图片后的回调函数。
	 */
	public static void loadImage(final String url, final ImageCallback callback) {
		if (url != null || callback != null) {
			new AsyncTask<Object, Object, Bitmap>() {
				@Override
				protected Bitmap doInBackground(Object... arg0) {
					return loadImg(url);
				}

				@Override
				protected void onPostExecute(Bitmap bitmap) {
					callback.imageLoaded(url, bitmap);
				}
			}.execute();
		} else {
			LoggerUtils.error(ImageCache.class.getName(), new IllegalArgumentException("图片URL或回调函数不能为空"));
			return;
		}
	}

	public static interface ImageCallback {
		public void imageLoaded(String url, Bitmap bitmap);
	}

	public static void loadImgBackground(final String url, final View view) {
		if (url != null && view != null) {
			new AsyncTask<Object, Object, Bitmap>() {
				@Override
				protected Bitmap doInBackground(Object... arg0) {
					view.setTag(url);
					return loadImg(url);
				}

				@Override
				protected void onPostExecute(Bitmap img) {
					if (img != null && url.equals(view.getTag())) {
						Drawable drawable = new BitmapDrawable(img);
						view.setBackgroundDrawable(drawable);
					}
				}
			}.execute();
		} else {
			LoggerUtils.error(ImageCache.class.getName(), new IllegalArgumentException("图片URL或控件不能为空"));
			return;
		}
	}

	/**
	 * 加载图片（该方法适合所有的view）
	 * 
	 * @param url
	 * @param view
	 * @param width
	 * @param height
	 * @param defaultImageId
	 * @author yzl
	 * @time 2013-7-27下午2:15:44
	 */
	public static void loadImgBackground(final String url, final View view, final int width, final int height, final Integer defaultImageId) {
		if (url != null && view != null) {
			new AsyncTask<Object, Object, Bitmap>() {
				@Override
				protected Bitmap doInBackground(Object... arg0) {
					view.setTag(url);
					return loadImg(url, width, height);
				}

				@Override
				protected void onPostExecute(Bitmap img) {
					if (url.equals(view.getTag())) {
						if (img == null) {
							if (defaultImageId != null) {
								view.setBackgroundResource(defaultImageId);
							}
						} else {
							Drawable drawable = new BitmapDrawable(img);
							view.setBackgroundDrawable(drawable);
						}
					}
				}
			}.execute();
		} else {
			LoggerUtils.error(ImageCache.class.getName(), new IllegalArgumentException("图片URL或控件不能为空"));
			return;
		}

	}

}
